//! src/common/error.rs

use std::fmt;

#[derive(Debug, PartialEq)] // 添加 PartialEq 以便在测试中断言错误类型
pub enum SimError {
    AddressOutOfBounds(u32),
    AddressMisaligned { addr: u32, size: usize },
    InvalidRegister(usize),
    InvalidInstruction(u32),
    // 之后可以添加更多，比如 InvalidInstruction
}

// 为错误类型实现 Display trait，这样它就能被友好地打印出来
impl fmt::Display for SimError {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        match self {
            Self::AddressOutOfBounds(addr) => write!(f, "内存地址 0x{:08X} 越界", addr),
            Self::AddressMisaligned { addr, size } => {
                write!(f, "内存地址 0x{:08X} 对于 {} 字节访问未对齐", addr, size)
            }
            Self::InvalidRegister(index) => write!(f, "无效的寄存器索引 {}", index),
            Self::InvalidInstruction(inst) => write!(f, "无效的指令 0x{:08X}", inst),
        }
    }
}

// 实现标准的 Error trait，让我们的错误类型能和 Rust 的 ? 运算符等标准机制一起工作
impl std::error::Error for SimError {}